{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# softmax回归的简洁实现",
   "id": "a792cb8aab5e3d94"
  },
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:00.945204Z",
     "start_time": "2025-08-11T09:27:57.751840Z"
    }
   },
   "source": [
    "from typing import Union, Callable\n",
    "\n",
    "import torch\n",
    "from matplotlib.pyplot import figure\n",
    "from torch import nn\n",
    "from d2l import torch as d2l\n",
    "from utils_09 import load_data_fashion_mnist\n",
    "import os"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.178600Z",
     "start_time": "2025-08-11T09:28:01.128281Z"
    }
   },
   "cell_type": "code",
   "source": [
    "batch_size = 256\n",
    "train_iter , test_iter = load_data_fashion_mnist(\n",
    "    batch_size,\n",
    "    cpu_workers=max(0, int(os.cpu_count() / 2) - 2)\n",
    ")"
   ],
   "id": "6e8cc1406a1df958",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.189373Z",
     "start_time": "2025-08-11T09:28:01.185473Z"
    }
   },
   "cell_type": "code",
   "source": [
    "net = nn.Sequential(\n",
    "    nn.Flatten(),## 把传入的DatasetLoader对象多维张量（也就是矩阵）展平为二维张量（矩阵），\n",
    "    ## 其中dim[0]保留，（也就是记录第几个样本的维度保留），其余维度转为向量\n",
    "    ## 如一个5*10*10的DatasetLoader对象最后转为5*100的矩阵\n",
    "    nn.Linear(784,10)\n",
    ")"
   ],
   "id": "840bbbf6ad2a1260",
   "outputs": [],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.205883Z",
     "start_time": "2025-08-11T09:28:01.202878Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def init_weights(m:Union[Callable,torch.nn.Linear]):\n",
    "    '''初始化权重矩阵'''\n",
    "    if isinstance(m,nn.Linear):\n",
    "        nn.init.normal_(m.weight)"
   ],
   "id": "689029fb529d12b0",
   "outputs": [],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.216724Z",
     "start_time": "2025-08-11T09:28:01.212745Z"
    }
   },
   "cell_type": "code",
   "source": "net.apply(init_weights) ## 对nn全部层应用init_weights操作",
   "id": "4dae4f3b43b803c0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Sequential(\n",
       "  (0): Flatten(start_dim=1, end_dim=-1)\n",
       "  (1): Linear(in_features=784, out_features=10, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.229793Z",
     "start_time": "2025-08-11T09:28:01.226925Z"
    }
   },
   "cell_type": "code",
   "source": "loss = nn.CrossEntropyLoss()",
   "id": "8163b8247fda893b",
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.242241Z",
     "start_time": "2025-08-11T09:28:01.239298Z"
    }
   },
   "cell_type": "code",
   "source": "trainer = torch.optim.SGD(net.parameters(),lr = 0.1)",
   "id": "ff378f282d349abf",
   "outputs": [],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.253561Z",
     "start_time": "2025-08-11T09:28:01.250561Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class Accumulator:\n",
    "    def __init__(self,n):\n",
    "        self.data = [0.0] * n ##创建n个计数器\n",
    "    def add(self,*args):\n",
    "        self.data = [a + float(b) for a,b in zip(self.data,args)]\n",
    "    def __getitem__(self, idx):\n",
    "        return self.data[idx]"
   ],
   "id": "aa912f44e734c0a4",
   "outputs": [],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.267512Z",
     "start_time": "2025-08-11T09:28:01.263507Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def accuracy(y_predict:torch.Tensor,y:torch.Tensor) -> torch.Tensor:\n",
    "    if len(y_predict.shape) > 1 and y_predict.shape[1] > 1:\n",
    "        y_predict = y_predict.argmax(axis = 1) ## 这里是获取最大元素的索引，不是值！！\n",
    "    cmp = y_predict.type(y.dtype) == y\n",
    "    cmp.type(y.dtype) ## 将cmp的数据格式转为y的数据格式，未转换前是bool，转换后为integer\n",
    "    return float(cmp.sum())"
   ],
   "id": "f31f48b4d4202840",
   "outputs": [],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:01.278693Z",
     "start_time": "2025-08-11T09:28:01.275744Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def evaluate_accuracy(net:Union[Callable,torch.nn.Module],data_iter:torch.utils.data.DataLoader):\n",
    "    if isinstance(net,torch.nn.Module):##判断net是否为torch.nn.Module\n",
    "       net.eval()\n",
    "    metric = Accumulator(2)\n",
    "    for X,y in data_iter:\n",
    "        metric.add(\n",
    "            accuracy(\n",
    "                net(X),y\n",
    "            ),\n",
    "            y.numel()\n",
    "        )\n",
    "    return metric[0]/metric[1]"
   ],
   "id": "c83c1df4dc81015f",
   "outputs": [],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T09:28:52.836817Z",
     "start_time": "2025-08-11T09:28:43.480769Z"
    }
   },
   "cell_type": "code",
   "source": [
    "num_epochs = 100\n",
    "metric = Accumulator(3)\n",
    "train_loss_record = list()\n",
    "train_acc_record = list()\n",
    "test_acc_record = list()\n",
    "for epoch in range(num_epochs):\n",
    "    for X,y in train_iter:\n",
    "        y_predict = net(X)\n",
    "        l = loss(y_predict,y)\n",
    "        trainer.zero_grad()\n",
    "        l.mean().backward()\n",
    "        trainer.step()\n",
    "        metric.add(float(l.sum()),accuracy(y_predict,y),y.numel())\n",
    "    train_metric = (metric[0]/metric[2],metric[1]/metric[2])\n",
    "    test_acc = evaluate_accuracy(net,test_iter)\n",
    "    print(f\"epoch {epoch}, train loss : {train_metric[0]}, train acc : {train_metric[1]},test_acc : {test_acc}\")\n",
    "    train_loss_record.append(train_metric[0])\n",
    "    train_acc_record.append(train_metric[1])\n",
    "    test_acc_record.append(test_acc)\n",
    "train_loss, train_acc = train_metric ## 训练结束，输出训练指标"
   ],
   "id": "7e6d2e401f9465ab",
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'device' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[31m---------------------------------------------------------------------------\u001B[39m",
      "\u001B[31mNameError\u001B[39m                                 Traceback (most recent call last)",
      "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[13]\u001B[39m\u001B[32m, line 17\u001B[39m\n\u001B[32m     15\u001B[39m     test_acc = evaluate_accuracy(net,test_iter)\n\u001B[32m     16\u001B[39m     \u001B[38;5;28;01mif\u001B[39;00m epoch % \u001B[32m5\u001B[39m == \u001B[32m0\u001B[39m:\n\u001B[32m---> \u001B[39m\u001B[32m17\u001B[39m         test_acc = evaluate_accuracy(net, test_iter, \u001B[43mdevice\u001B[49m)\n\u001B[32m     18\u001B[39m         \u001B[38;5;28mprint\u001B[39m(\u001B[33mf\u001B[39m\u001B[33m\"\u001B[39m\u001B[33mEpoch \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mepoch\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m: Train Loss \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mtrain_loss\u001B[38;5;132;01m:\u001B[39;00m\u001B[33m.4f\u001B[39m\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m, Test Acc \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mtest_acc\u001B[38;5;132;01m:\u001B[39;00m\u001B[33m.4f\u001B[39m\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m\"\u001B[39m)\n\u001B[32m     19\u001B[39m train_loss, train_acc = train_metric \u001B[38;5;66;03m## 训练结束，输出训练指标\u001B[39;00m\n",
      "\u001B[31mNameError\u001B[39m: name 'device' is not defined"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T08:41:18.944931Z",
     "start_time": "2025-08-11T08:41:18.817770Z"
    }
   },
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 3 Axes>"
      ],
      "image/png": "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bu4dv0Zqnzh2yVJx7FomK6k7QKZTWloKANixYwd8fX2N7lMqlUZv1Jays7NrUjtra2vxv2UyGQD9dXmixnDskqXi2LVMzBx1IEFBQVAqlcjKykKvXr2Mbn5+fmK7AwcOiP9948YNnDt3Dv369QMA9OvXD/v27TM67759+9CnTx8oFAoEBwdDp9Nh7969pnlR1CFw7JKl4ti1TMwcdSCOjo54+eWXMX/+fOh0OkRHR6O4uBj79u2Dk5MTunfvDgBYunQpXF1d4enpiTfffBNubm4YP348AOBvf/sb7rnnHixbtgwTJ05EcnIy/vWvf+GTTz4BAPj7+2PatGn4y1/+go8//hihoaG4fPkycnNz8cQTT0j10snCceySpeLYtVBSFz2Rael0OmHVqlVCYGCgYG1tLbi7uwuxsbHC3r17xaK977//Xujfv79gY2MjRERECMeOHTM6x9atW4WgoCDB2tpa6Natm/D+++8b3V9RUSHMnz9f8Pb2FmxsbIRevXoJ69atEwShrjDwxo0bYvsjR44IAITMzMy2fvlkwTh2yVJx7FoemSAIgmSRGZmVPXv24IEHHsCNGzfg4uIidXeImoxjlywVx655Ys0RERERUT0MjoiIiIjq4WU1IiIionqYOSIiIiKqh8ERERERUT0MjoiIiIjqYXBEREREVA+DIyIiIqJ6GBwRERER1cPgiIiIiKgeBkdERERE9fw/ezmxzJsOsF4AAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 49,
   "source": [
    "## 查看epoch与train-acc, train-loss及test-loss的关系\n",
    "from matplotlib import pyplot as plt\n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(131)\n",
    "ax1.plot(range(num_epochs),train_acc_record)\n",
    "ax1.set_xlabel('epoch')\n",
    "ax1.set_ylabel('acc')\n",
    "ax2 = fig.add_subplot(132)\n",
    "ax2.plot(range(num_epochs),train_loss_record)\n",
    "ax2.set_xlabel('epoch')\n",
    "ax2.set_ylabel('loss')\n",
    "ax3 = fig.add_subplot(133)\n",
    "ax3.plot(range(num_epochs),test_acc_record)\n",
    "ax3.set_xlabel('epoch')\n",
    "ax3.set_ylabel('test acc')\n",
    "plt.show()"
   ],
   "id": "39052a501652ae41"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-11T08:47:48.305463Z",
     "start_time": "2025-08-11T08:47:44.874153Z"
    }
   },
   "cell_type": "code",
   "outputs": [],
   "execution_count": 58,
   "source": [
    "## 获取测试集上的预测标签\n",
    "for X,y in test_iter:\n",
    "    break\n",
    "predict =net(X)\n",
    "predict_index = predict.argmax(axis = 1)\n",
    "print(predict_index)\n",
    "print(d2l.get_fashion_mnist_labels(predict_index))"
   ],
   "id": "10dd6eb2ae5932f8"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
